home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / daymisckit_proj / daymisckit-1 / ExtendedApp.m < prev    next >
Text File  |  1995-06-12  |  5KB  |  116 lines

  1. //
  2. //    ExtendedApp.m -- a class to make extra information available via the
  3. //        application object.  If you use this object, you must link
  4. //        against ni_s or you'll get errors!
  5. //        Written by Don Yacktman (c) 1993 by Don Yacktman.
  6. //                Version 1.0.  All rights reserved.
  7. //
  8. //        This is a free object!  Contact the author for the latest version.
  9. //        Don Yacktman, 4279 N. Ivy Lane, Provo, UT, 84604
  10. //        e-mail:  Don_Yacktman@byu.edu
  11. //
  12. //        You may use and copy this class freely as long as you
  13. //        comply with the following terms:
  14. //            (1) Do not remove the author's name or any of the
  15. //                copyright notices from this file.
  16. //            (2) If you redistribute an application which uses this
  17. //                object, you must either include the source code for
  18. //                this object with the application or state in your
  19. //                application's documentation that you (a) use this
  20. //                object and (b) where to obtain the source code for
  21. //                the object.
  22. //            (3) In no way shall the author or his employer(s) be held
  23. //                responsible for any damages caused by what this object
  24. //                does or does not do.
  25. //            (4) You have no warranty whatsoever that this object is
  26. //                good for any purpose at all.  If you find it useful
  27. //                for something, consider yourself lucky and leave it at that.
  28. //
  29.  
  30. #import <daymisckit/daymisckit.h>
  31. #import <strings.h>
  32. #import <libc.h>        // for chdir, getwd
  33. #import <nikit/NIDomain.h>
  34. #import <netinfo/ni.h>
  35.  
  36. @implementation ExtendedApp
  37.  
  38. + new;    // application uses new, not init.  Want to save path to app
  39. {        // and obtain other misc. info after Application does it's init.
  40.     self = [super new];
  41.     gethostname(realHostName, MAXHOSTNAMELEN);
  42.     userRealName = [self realNameFor:NXUserName()];
  43.     return self;
  44. }
  45.  
  46.  
  47. - (const char *)appDirectory; { return [[NXBundle mainBundle] directory]; }
  48. - (int)userIDNum { return getuid(); }
  49. - (int)groupIDNum { return getgid(); }
  50. - (int)effectiveUserIDNum { return geteuid(); }
  51. - (int)effectiveGroupIDNum { return getegid(); }
  52. - (unsigned long int)hostID { return gethostid(); }
  53. - (NXAtom)userHomeDirectory { return NXHomeDirectory(); }
  54. - (NXAtom)userLoginName { return NXUniqueString(NXUserName()); }
  55. - (NXAtom)userRealName { return userRealName; }
  56. - (NXAtom)realHostName { return NXUniqueString(realHostName); }
  57.  
  58. // Attempt to get the real name corresponding to user id.
  59. // This will work for local users or network users who are in the
  60. // root domain.  Any other domain will most likely fail, and we
  61. // then fall back to the login name.  If you know of a more general
  62. // way to do this search that will _always_ be successful, or a
  63. // better way to get this information, please let me know!
  64. - (NXAtom)realNameFor:(NXAtom)userId
  65. {
  66.     id    niDomain; ni_status connectStatus;
  67.     char path[MAXPATHLEN]; void *domainHandle;
  68.     ni_id rootID; ni_namelist realNameList;
  69.     char *name;
  70.  
  71.     niDomain = [[NIDomain allocFromZone:[self zone]] init];
  72.     strcpy(path, "/users/"); strcat(path, userId);
  73.     // try local domain first
  74.     if (connectStatus = [niDomain setConnection:"."]) {
  75.         NXLogError("%s:  NIDomain -setConnection:\".\" returned %s.\n",
  76.                     [NXApp appName], ni_error(connectStatus));
  77.         return NXUniqueString(userId);
  78.     }
  79.     domainHandle = [niDomain getDomainHandle];
  80.     if (connectStatus = ni_root(domainHandle, &rootID)) {
  81.         NXLogError("%s:  ni_root returned %s.\n",
  82.                 [NXApp appName], ni_error(connectStatus));
  83.         return NXUniqueString(userId);
  84.     }
  85.     if (connectStatus = ni_pathsearch(domainHandle, &rootID, path)) {
  86.         // try in root domain, then, since not in local.
  87.         niDomain = [[NIDomain allocFromZone:[self zone]] init];
  88.         if (connectStatus = [niDomain setConnection:"/"]) {
  89.             NXLogError("%s:  NIDomain -setConnection:\"/\" returned %s.\n",
  90.                     [NXApp appName], ni_error(connectStatus));
  91.             return NXUniqueString(userId);
  92.         }
  93.         domainHandle = [niDomain getDomainHandle];
  94.         if (connectStatus = ni_root(domainHandle, &rootID)) {
  95.             NXLogError("%s:  ni_root returned %s.\n",
  96.                     [NXApp appName], ni_error(connectStatus));
  97.             return NXUniqueString(userId);
  98.         }
  99.         if (connectStatus = ni_pathsearch(domainHandle, &rootID, path)) {
  100.             NXLogError("%s:  ni_pathsearch (%s) returned %s.\n",
  101.                     [NXApp appName], path, ni_error(connectStatus));
  102.             return NXUniqueString(userId);
  103.         }
  104.     }
  105.     if (connectStatus = ni_lookupprop(domainHandle, &rootID,
  106.             "realname", &realNameList)) {
  107.         NXLogError("%s:  ni_lookupprop returned %s.\n",
  108.                 [NXApp appName], ni_error(connectStatus));
  109.         return NXUniqueString(userId);
  110.     }
  111.     name = *(realNameList.ni_namelist_val);
  112.     return NXUniqueString(name);
  113. }
  114.  
  115. @end
  116.